home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HPAVC
/
HPAVC CD-ROM.iso
/
SNNSV32.ZIP
/
SNNSv3.2
/
kernel
/
sources
/
kr_pat_parse.y
< prev
next >
Wrap
Text File
|
1994-04-25
|
9KB
|
408 lines
/*****************************************************************************
FILE : kr_pat_parse.y
SHORTNAME : pat_parse
SNNS VERSION : 3.2
PURPOSE : parser for new pattern format; bison format
NOTES : impossible to use with yacc
AUTHOR : Michael Vogt
DATE : 10.9.93
CHANGED BY :
IDENTIFICATION : @(#)kr_pat_parse.y 1.4 4/14/94
SCCS VERSION : 1.4
LAST CHANGE : 4/14/94
Copyright (c) 1990-1993 SNNS Group, IPVR, Univ. Stuttgart, FRG
******************************************************************************/
%{
#include <stdio.h>
/* since the generated parser needs alloca we need to do some special things */
/* for some architectures: */
#ifndef alloca
#ifndef __GNUC__
#ifdef __hpux
#include <malloc.h>
#include <stdio.h>
#endif /* __hpux */
#ifdef sparc
#include <alloca.h>
#endif /* sparc */
#endif /* GNU C. not defined */
#endif /* alloca not defined. */
#include "kr_typ.h"
#include "glob_typ.h"
#include "kernel.h"
#include "kr_pat_scan.h"
#include "kr_newpattern.h"
#include "kr_pat_parse.ph"
%}
%union
{
float value; /* allgemeine Zahl */
struct
{
int v;
int r;
} version; /* Versionsnummer #.# */
}
%token L_BRACKET R_BRACKET
%token VERSION_HEADER
%token GENERATED_AT
%token NO_OF_PATTERN NO_OF_INPUT NO_OF_OUTPUT
%token NO_OF_VAR_IDIM NO_OF_VAR_ODIM
%token MAXIMUM_IDIM MAXIMUM_ODIM
%token ERROR PATTERNEND
%token <value> NUMBER
%token <version> V_NUMBER
%%
pattern_file: header
{
current_pattern = 0;
next_pattern_is_input = 1;
if (kr_np_AllocatePatternSet(&pattern_set, no_of_pattern)
!= KRERR_NO_ERROR)
{
yyerror("can't allocate memory");
YYABORT;
}
}
pattern_list
{
if (current_pattern < no_of_pattern ||
!next_pattern_is_input)
{
yyerror("unexpected end of file");
YYABORT;
}
}
;
header: VERSION_HEADER V_NUMBER
{
if (($2.v == CURRENT_VERSION_V && $2.r > CURRENT_VERSION_R) ||
$2.v > CURRENT_VERSION_V)
{
yyerror("version of pattern file not supported");
YYABORT;
}
}
GENERATED_AT NO_OF_PATTERN NUMBER
{
no_of_pattern = (int) $6;
if (no_of_pattern <= 0)
{
yyerror("illegal number of pattern");
YYABORT;
}
}
i_head o_head vi_head vo_head
;
i_head: NO_OF_INPUT NUMBER
{
no_of_input = (int) $2;
if (no_of_input < 0)
{
yyerror("illegal number of input units");
YYABORT;
}
}
;
o_head: NO_OF_OUTPUT NUMBER
{
no_of_output = (int) $2;
if (no_of_output < 0)
{
yyerror("illegal number of output units");
YYABORT;
}
}
|
{ no_of_output = 0; }
;
vi_head: NO_OF_VAR_IDIM NUMBER MAXIMUM_IDIM actual_dim
{
variable_input_dim = $2;
if (variable_input_dim < 0 ||
variable_input_dim > MAX_NO_OF_VAR_I_DIM)
{
yyerror("illegal variable input dimensions");
YYABORT;
}
if (actual_dim_count != variable_input_dim)
{
yyerror("illegal number of entries in dimension list");
YYABORT;
}
for (i=0; i<variable_input_dim; i++)
max_i_dims[i] = dims[i];
}
|
{ variable_input_dim = 0; }
;
vo_head: NO_OF_VAR_ODIM NUMBER MAXIMUM_ODIM actual_dim
{
variable_output_dim = $2;
if (variable_output_dim < 0 ||
variable_output_dim > MAX_NO_OF_VAR_O_DIM ||
no_of_output == 0)
{
yyerror("illegal variable output dimensions");
YYABORT;
}
if (actual_dim_count != variable_output_dim)
{
yyerror("illegal number of entries in dimension list");
YYABORT;
}
for (i=0; i<variable_output_dim; i++)
max_o_dims[i] = dims[i];
}
|
{ variable_output_dim = 0; }
;
actual_dim: L_BRACKET
{
actual_dim_count = 0;
}
actual_dim_rest R_BRACKET
| L_BRACKET R_BRACKET
{
actual_dim_count = 0;
}
;
actual_dim_rest: dim_entry
| actual_dim_rest dim_entry
;
dim_entry: NUMBER
{
if (actual_dim_count >= MAX_NO_OF_VAR_DIM)
{
yyerror("to many entries in dimension list");
YYABORT;
}
dims[actual_dim_count] = (int) $1;
if (dims[actual_dim_count] <= 0)
{
yyerror("illegal size of dimension");
YYABORT;
}
actual_dim_count++;
}
;
pattern_list: pattern
| pattern_list pattern
;
pattern:
{
if (current_pattern >= no_of_pattern)
{
yyerror("to many patterns");
YYABORT;
}
}
pattern_start
{
if (kr_np_GetDescriptor(pattern_set, current_pattern, &pattern)
!= KRERR_NO_ERROR)
{
yyerror("pattern parser internal error");
YYABORT;
}
if (next_pattern_is_input)
{
pattern -> input_fixsize = no_of_input;
pattern -> input_dim = variable_input_dim;
pattern -> output_fixsize = no_of_output;
pattern -> output_dim = variable_output_dim;
if (actual_dim_count != variable_input_dim)
{
yyerror("illegal number of entries in dimension list");
YYABORT;
}
act_size = no_of_input;
for (i=0; i<variable_input_dim; i++)
{
if (dims[i] > max_i_dims[i])
{
yyerror("variable dimension overflow");
YYABORT;
}
act_size *= dims[i];
(pattern -> input_dim_sizes)[i] = dims[i];
}
if (kr_np_AllocatePattern(pattern, next_pattern_is_input)
!= KRERR_NO_ERROR)
{
yyerror("can't allocate memory");
YYABORT;
}
pat_mem = pattern -> input_pattern;
}
else
{
if (actual_dim_count != variable_output_dim)
{
yyerror("illegal number of entries in dimension list");
YYABORT;
}
act_size = no_of_output;
for (i=0; i<variable_output_dim; i++)
{
if (dims[i] > max_o_dims[i])
{
yyerror("variable dimension overflow");
YYABORT;
}
act_size *= dims[i];
(pattern -> output_dim_sizes)[i] = dims[i];
}
if (kr_np_AllocatePattern(pattern, next_pattern_is_input)
!= KRERR_NO_ERROR)
{
yyerror("can't allocate memory");
YYABORT;
}
pat_mem = pattern -> output_pattern;
}
}
pattern_body
{
if (act_size > 0)
{
yyerror("to little values in pattern");
YYABORT;
}
if (no_of_output > 0)
next_pattern_is_input = !next_pattern_is_input;
if (next_pattern_is_input)
current_pattern++;
}
PATTERNEND
;
pattern_start: actual_dim
| /* empty */
{
actual_dim_count = 0;
}
;
pattern_body: pattern_entry
| pattern_body pattern_entry
;
pattern_entry: NUMBER
{
if (act_size == 0)
{
yyerror("to many values in pattern");
YYABORT;
}
*pat_mem++ = $1;
if (--act_size == 0)
scanner_await_pattern_end();
}
;
%%
#ifndef alloca
#ifndef __GNUC__
#ifdef __hpux
/*****************************************************************************
FUNCTION : alloca
PURPOSE : must be provided for the parser.
Uses malloc to allocate memory. This memory is not automatically
freed as in the original alloca definition
RETURNS : pointer to memory
NOTES : This is necessary for HP_UX only since there comes no alloca()
with the HP cc C-compiler.
It is not necessary with Gnu C
UPDATE :
******************************************************************************/
void *alloca(int size)
{
void *p;
p = malloc(size);
fprintf(stderr, "warning: malloc called instead of alloca\n");
return p;
}
#endif /* __hpux */
#endif /* GNU C. not defined */
#endif /* alloca not defined. */
/*****************************************************************************
FUNCTION : yyerror
PURPOSE : must be provided for the parser.
reports errors in pattern file to stderr
RETURNS : nothing
NOTES :
UPDATE :
******************************************************************************/
static void yyerror(char *error)
{
fprintf(stderr, "Parse error in pattern file at line %d:\n%s\n",
lineno, error);
}
/*****************************************************************************
FUNCTION : parse_pattern_file
PURPOSE : calls the real parser
RETURNS : parser error code and the handle to the loaded pattern set
NOTES :
UPDATE :
******************************************************************************/
int parse_pattern_file(int *set)
{
int err;
lineno = 1;
err = yyparse();
*set = pattern_set;
if (err == 0)
lineno = 0;
return err;
}
/*****************************************************************************
END OF FILE
******************************************************************************/